//
//  MFAPMUtility.h
//  MFAPMManager
//
//  Created by zhang liyu on 2019/5/22.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 性能检测相关工具类
 */
@interface MFAPMUtility : NSObject


/**
 NSData 转JSON 合法就转成JSON字符串，不合法utf-8转码字符串
 
 @param data 需要转换的数据
 @return 转换后的数据
 */
+ (NSString *)convertJSONStringFromData:(NSData *)data;

/**
 对象 转JSON 合法就转成JSON字符串，不合法utf-8转码字符串
 
 @param object 需要转换的对象
 @return 转换后的数据
 */
+ (NSString *)convertJSONStringFromObject:(id)object;

/**
 JSON 转Dictionary 合法就转成Dictionary，不合法转为空字典
 
 @param JSONString 需要转换的JSON字符串
 @return 转换后的数据
 */
+ (NSDictionary *)convertDictionaryFromJsonString:(NSString *)JSONString;

/**
 Dictionary 转Data 合法就转成Data，不合法转为空Data
 
 @param dict 需要转换的Dictionary字典
 @return 转换后的数据
 */
+ (NSData *)convertDataFromDictionary:(NSDictionary *)dict;

/**
 String 转化为JSON字符串，去除内部的\n和\r
 
 @param str 需要转换的字符串
 @return 转换后的数据
 */
+ (NSString *)convertJSONStringFromString:(NSString *)str;


/**
 从request中获取请求体httpBody
 
 @param request 请求
 @return 请求体
 */
+ (NSData *)getHttpBodyFromRequest:(NSURLRequest *)request;


/**
 获取当前最顶部的视图控制器ViewController（注：目前是在主线程进行的获取当前视图，可能存在性能问题）
 
 @return 当前显示的最顶部的视图控制器
 */
+ (UIViewController *)currentTopViewController;

/**
 获取当前NavigationController栈中的VC链路
 
 @return 视图控制器链路
 */
+ (NSArray *)currentViewControllerPath;


/**
 获取当前的屏幕截图
 
 @return 屏幕截图
 */
+ (UIImage *)imageWithScreenshot;


/**
 获取屏幕截图的jpg数据
 
 @return jpg数据
 */
+ (NSData *)imageDataWithScreenshot;

/**
 根据限定尺寸大小进行图片的等比压缩
 
 @param img 待处理图片
 @param maxLength 允许图片数据的最大大小，单位B
 @return 处理好的图片Data
 */
+ (NSData *)compressImage:(UIImage *)img withMaxLength:(NSUInteger)maxLength;


/**
 图片等比压缩，按照分辨率
 
 @param img 待处理图片
 @param scaleFactor 放缩比例 0-1，1为原图
 @returnf 放缩后的图片
 */
+ (UIImage *)scaleImage:(UIImage *)img withScaleFactor:(CGFloat)scaleFactor;


/**
 计算文件大小 带单位的bytes、KB、MB、GB、TB、PB、EB、ZB、YB
 
 @param data 数据
 @return xxxKB
 */
+ (NSString *)calulateFileSize:(NSData *)data;

/**
 计算当前CPU使用率
 
 @return CPU使用百分比
 */
+ (float)cpuUsage;

/**
 计算当前内存使用，同Xcode检测结果一致，具体显示需要确认下
 
 @return 内存使用大小
 */
+ (NSString *)memoryUsage;

/**
 计算当前内存使用百分比
 
 @return 内存使用百分比
 */
+ (float)memoryUsedPercent;

/**
 当前的网络类型
 
 @return  0(未知)、1 (WIFI)、2(2G)、3(3G)、4(4G)、5(5G) 、9(断网)
 */
+ (NSString *)currentNetworkType;

/**
 解析URL请求对应scheme参数
 
 @return key : val 形式的参数字典
 */
+ (NSDictionary *)parseQueryString:(NSString *)query;

/**
 在主线程调用回调
 
 @param block 要进行调用的回调
 */
+ (void)dispatchAsyncOnMainThread:(void (^)(void))block;

/**
 KeyChain 保存数据
 
 @param service 要保存的服务名称，即对应数据的key
 @param data 要保存的数据
 */
+ (void)keyChainSaveToService:(NSString *)service withData:(id)data;

/**
 KeyChain 获取数据
 
 @param service 对应数据的key
 @return 保存的数据
 */
+ (id)keyChainLoadByService:(NSString *)service;

/**
 KeyChain 删除数据
 
 @param service 对应数据的key
 */
+ (void)keyChainDeleteDataByService:(NSString *)service;

/**
 当前程序调用栈字符串
 
 @return 以\n分割的调用栈字符串
 */
+ (NSString *)callerStackStr;

/**
 NSUserDefault 存储数据
 
 @param obj 要存储的对象，标量对象，非自定义对象
 @param key 存储对象对应的Key
 */
+ (void)userDefaultStore:(_Nonnull id)obj forKey:(NSString * _Nonnull)key;

/**
 NSUserDefault 获取数据
 
 @param key 返回值对应的Key
 */
+ (id)userDefaultObjForKey:(NSString * _Nonnull)key;

/**
 判断两个日期是否为同一天
 
 @param oldDate 需要判断是否相等的旧日期
 @param newDate 需要判断是否相等的新日期
 */
+ (BOOL)checkIsSameDate:(NSDate *)oldDate withDate:(NSDate *)newDate;

/**
 按照传入的步长等分数组为多个小数组
 
 @param srcArr  要被等分的数组
 @param stepLength 等分的步长，每个小数组的个数
 @return 等分好的数组
 */
+ (NSArray<NSArray *> *)dividSourceArr:(NSArray *)srcArr byStepLength:(NSUInteger)stepLength;

/**
 对传入数据进行32位MD5加密
 
 @param srcString 要进行加密的字串
 @return 32位MD5加密后的字符串
 */
+ (NSString *)MD5In32BitFromStr:(NSString *)srcString;
@end

NS_ASSUME_NONNULL_END
